#include <mips/regdef.h>
#include <sys/syscall.h>
# Programa que calcula y devuelve el maximo comun 
# divisor entre dos numeros ingresados por parametro.

	.text
	.globl 	mcm
	.ent mcm
mcm:

	# PIDE ESPACIO PARA EL STACK
	
	.frame	$fp, 40, ra
	subu	sp, sp, 40		# se trata de una funcion "non-leaf".
	.cprestore 24
	
	# GUARDA EL SAVED REGS AREA
	
	sw		ra, 32(sp)		# almacena el Return Adress ($ra).
	sw		$fp, 28(sp)		# almacena el Frame Pointer ($fp).
	sw		gp, 24(sp)		# almacena el Global Pointer ($gp).

	# GUARDA ARG BUILDING AREA
		
	sw		a0, 40(sp)		# almaceno a0.
	sw		a0, 12(sp)
	sw		a1, 44(sp)		# almaceno a1.
	sw		a1, 16(sp)
	move		$fp, sp

	# REALIZA EL LLAMADO A LA FUNCION DE DIVISOR
	la		t9, mcd
	jal		ra, t9			# llamada a la funcion del divisor (a0 y a1 ya contienen los numeros M y N).

	# RECUPERA ARG BUILDING AREA

	lw		t0, 12(sp)		# cargo a0 en t0.	
	lw		t1, 16(sp)		# cargo a1 en t1.

	# CALCULA EL MULTIPLO

	move	t2, v0			# almacena el divisor (devuelto en v0) en el registro t2.
	mult	t0, t1			
	mflo	t3			# el resultado de M * N lo guarda en t3.
	div	t3, t2		
	mflo	t4			# guarda la division en t4.
	move	v0, t4			# finalmente almacena el resultado en el registro v0.

	# DESTRUYE EL STACK
	
	move	sp, $fp
	lw	$fp, 28(sp)
	addu	sp, sp, 40		# libera el stack.

	# REGRESA A LA RUTINA CALLEE

	j	ra
	.end	mcm
	
